package jp.seraph.jsade.sexpression;

/**
 * S式を表すインターフェース
 *
 *
 */
public interface SExpression {
    public boolean isNode();
    public boolean isLeaf();

    /**
     * ノードを左に辿っていって、最初に見つけたLeafの値を返します。
     *
     * @return
     */
    public String getLeftString();

    /**
     * このインターフェースが表す式の子が何個あるかを表す。
     * 
     * @return
     */
    public int childCount();
    
    /**
     * aIndex番目の子を返す。<br>
     * aIndexは0始まり
     * 
     * @param aIndex
     * @return aIndex番目の子
     */
    public SExpression getChild(int aIndex);
    
    /**
     * aIndex番目の子をLeafとして返す。
     * 
     * @param aIndex
     * @return aIndex番目の子。 Leafで無ければnull
     */
    public Leaf getChildAsLeaf(int aIndex);
    
    /**
     * aIndex番目の子をNodeとして返す。
     * 
     * @param aIndex
     * @return aIndex番目の子。　Nodeでなければnull
     */
    public Node getChildAsNode(int aIndex);
    
    /**
     * 引数のVisitorを受理する
     * 
     * @param aVisitor 受理するVisitor
     */
    public void accept(ExpressionVisitor aVisitor);
}
